package testjeu;

import org.newdawn.slick.Animation;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.Sound;
import org.newdawn.slick.SpriteSheet;


public class TankEnnemi extends Ennemis implements Constantes {

    private Image sprite, vue;
    private int[][] portéeDeTir = new int[3][2];  // 3 case de 2 coordonnées  [0]=X [1]=Y
    private int[][] portéeDeTirDiag = new int[4][2];   // Portée de tir avec en plus la position du tank, pour faciliter la rechercher de franchissement
    private int[]   coordDebutTir = new int[2];
    
    static SpriteSheet spriteTanks;
    static boolean init=false;
    static Image all, vueNormale, vueDiagonale;
    
    private Sound sonTir;
    
    
    public TankEnnemi(int col, int lig, int ang) throws SlickException {
        super(col, lig, ang);
        
        if (!init) {
            all = new Image("res/sprite_tankEnnemis.png");
            vueNormale=all.getSubImage(0, 80, 120, 40);
            vueDiagonale=all.getSubImage(0, 120, 120, 120);
            spriteTanks=new SpriteSheet(all, 40, 40);
            init=true;
        }
        
        sonTir=new Sound("res/laser.wav");
        
        // On calcule le décalage X et Y pour initialiser la portée de tir
        // On charge le sprite du tank et sa vue.
        
        int dX=0, dY=0;
        switch (ang) {
            
            case 0:     
                dX=1;
                
                sprite=spriteTanks.getSprite(0, 0);
                vue=vueNormale;
            break;
            case 90:
                dY=1;           
                
                sprite=spriteTanks.getSprite(0, 0); sprite.setRotation(90);
                vue=vueNormale.copy(); vue.setRotation(90);
            break;
            case 180:   
                dX=-1;          
                
                sprite=spriteTanks.getSprite(0, 0); sprite.setRotation(180);
                vue=vueNormale.copy(); vue.setRotation(180);
            break;
            case 270:
                dY=-1;          
                
                sprite=spriteTanks.getSprite(0, 0); sprite.setRotation(270);
                vue=vueNormale.copy(); vue.setRotation(270);
            break;   
            case 45:    
                dX=1;  dY=1;    
                sprite= spriteTanks.getSprite(1,0);  
                vue=vueDiagonale.copy(); vue.setRotation(90);
            break;
            case 135:
                dX=-1; dY=1;    
                sprite= spriteTanks.getSprite(1,0); sprite.setRotation(90);
                vue=vueDiagonale.copy(); vue.setRotation(180);
            break;
            case 225:
                dX=-1; dY=-1;   
                sprite= spriteTanks.getSprite(1,0); sprite.setRotation(180);
                vue=vueDiagonale.copy(); vue.setRotation(270);
            break;
            case 315:   
                dX=1;  dY=-1;   
                sprite= spriteTanks.getSprite(1,0); sprite.setRotation(270);
                vue=vueDiagonale;
            break;
        }
        
        // On met les portées de tir
        for (int i=0;i<3;i++) {
            this.portéeDeTir[i][0]=x+(i+1)*dX;
            this.portéeDeTir[i][1]=y+(i+1)*dY;
            if (ang%90!=0) {
            	this.portéeDeTirDiag[i+1][0]= this.portéeDeTir[i][0];
            	this.portéeDeTirDiag[i+1][1]= this.portéeDeTir[i][1];
            }
        }
        if (ang%90!=0) {
        	this.portéeDeTirDiag[0][0]=col;
        	this.portéeDeTirDiag[0][1]=lig;
        }
        
        // On adapte en fonction de l'angle les coordonnées d'affichage du sprite de vue.
        switch (ang) {
            
            case 0:     
                coordDebutTir[0]=cases.colToPxl(portéeDeTir[0][0]);
                coordDebutTir[1]=cases.ligToPxl(portéeDeTir[0][1]);
            break;
            case 90:
                coordDebutTir[0]=cases.colToPxl(portéeDeTir[0][0]-1);
                coordDebutTir[1]=cases.ligToPxl(portéeDeTir[0][1]+1);
            break;
            case 180:   
                coordDebutTir[0]=cases.colToPxl(portéeDeTir[2][0]);
                coordDebutTir[1]=cases.ligToPxl(portéeDeTir[2][1]);
            break;
            case 270:
                coordDebutTir[0]=cases.colToPxl(portéeDeTir[0][0]-1);
                coordDebutTir[1]=cases.ligToPxl(portéeDeTir[0][1]-1);
            break;

            case 45:  
                coordDebutTir[0]=cases.colToPxl(portéeDeTir[0][0]);
                coordDebutTir[1]=cases.ligToPxl(portéeDeTir[0][1]);
            break;
            case 135:
                coordDebutTir[0]=cases.colToPxl(portéeDeTir[0][0]-2);
                coordDebutTir[1]=cases.ligToPxl(portéeDeTir[0][1]);
            break;
            case 225:
                coordDebutTir[0]=cases.colToPxl(portéeDeTir[2][0]);
                coordDebutTir[1]=cases.ligToPxl(portéeDeTir[2][1]);
            break;
            case 315:  
                coordDebutTir[0]=cases.colToPxl(portéeDeTir[0][0]);
                coordDebutTir[1]=cases.ligToPxl(portéeDeTir[0][1]-2);
            break;
        }
        
        // Animation de la destruction
        destruction = new Animation(spriteTanks, 0, 1, 4, 1, true, 200, true);
        
    }
    
    public void dessiner(Graphics g) {
        if (enVie) 
            sprite.draw(cases.colToPxl(x), cases.ligToPxl(y));
        else {
            destruction.draw(cases.colToPxl(x), cases.ligToPxl(y));
            destruction.stopAt(4);
        }

        if (enVie)  vue.draw(coordDebutTir[0], coordDebutTir[1]); 
      
    }
    
    public boolean estDansPortéeDeTir(int col, int lig, int oldCol, int oldLig, int ang) {
    	boolean boom=false;
        boom= enVie && (
                    (col==portéeDeTir[0][0] && lig==portéeDeTir[0][1]) ||
                    (col==portéeDeTir[1][0] && lig==portéeDeTir[1][1]) ||
                    (col==portéeDeTir[2][0] && lig==portéeDeTir[2][1])
                );
        
        if (!boom && ang%90!=0 && this.angle%90!=0 && (ang-this.angle)%90==0) {
        	for (int i=0;i<3;i++) {
        		if (col+oldCol==portéeDeTirDiag[i][0]+portéeDeTirDiag[i+1][0] &&
        			lig+oldLig==portéeDeTirDiag[i][1]+portéeDeTirDiag[i+1][1])
        				boom=true;
        	}
        }
        
        // Son de tir si le gars est pointé
        if (boom) sonTir.play();
        
        return boom;        
    }

    
}
